package com.xxxtea.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxtea.common.Result;
import com.xxxtea.dto.PageQuery;
import com.xxxtea.entity.Task;
import com.xxxtea.entity.TaskStage;
import com.xxxtea.service.TaskService;
import com.xxxtea.service.TaskStageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 任务阶段控制器
 *
 * 提供任务阶段的完整管理功能，包括：
 * - 任务阶段的增删改查
 * - 阶段进度与异常状态同步到任务主表
 * - 分页与列表查询
 *
 * 使用Swagger注解进行API文档生成
 * 使用Lombok注解简化代码
 *
 * @author badman
 * @since 1.0.0
 */
@Slf4j
@Api("任务阶段接口")
@RestController
@RequestMapping("/taskStage")
public class TaskStageController {
	/**
	 * 任务服务
	 */
	@Resource
	private TaskService taskService;
	
	/**
	 * 任务阶段服务
	 */
	@Resource
	private TaskStageService taskStageService;

	/**
	 * 新增任务阶段
	 * 新增后自动同步进度和异常状态到任务主表
	 *
	 * @param request 任务阶段信息
	 * @return 操作结果
	 */
	@PostMapping
	@ApiOperation("新增任务阶段")
	public Result<String> save(@RequestBody TaskStage request) {
		if (!taskStageService.save(request)) {
			return Result.error("添加失败!");
		}
		Integer value = request.getStatus().getValue();
		taskService.lambdaUpdate().eq(Task::getId, request.getTaskId())
				.set(Task::getProgress, value * 20)
				.set(request.getIsAbnormal() == TaskStage.IsAbnormal.YES, Task::getIsAbnormal, TaskStage.IsAbnormal.YES)
				.update();
		return Result.success();
	}

	/**
	 * 删除任务阶段
	 *
	 * @param id 阶段ID
	 * @return 操作结果
	 */
	@DeleteMapping("/{id}")
	@ApiOperation("删除任务阶段")
	public Result<String> removeById(@PathVariable String id) {
		if (!taskStageService.removeById(id)) {
			return Result.error("删除失败!");
		}
		return Result.success();
	}

	/**
	 * 更新任务阶段
	 *
	 * @param request 任务阶段信息
	 * @return 操作结果
	 */
	@PutMapping
	@ApiOperation("更新任务阶段")
	public Result<String> updateById(@RequestBody TaskStage request) {
		if (!taskStageService.updateById(request)) {
			return Result.error("更新失败!");
		}
		return Result.success();
	}

	/**
	 * 查询任务阶段详情
	 *
	 * @param id 阶段ID
	 * @return 阶段详情
	 */
	@GetMapping("/{id}")
	@ApiOperation("查询任务阶段详情")
	public Result<TaskStage> getById(@PathVariable String id) {
		return Result.success(taskStageService.getById(id));
	}

	/**
	 * 查询任务阶段列表
	 * 按阶段状态倒序排列
	 *
	 * @param request 查询条件
	 * @return 阶段列表
	 */
	@GetMapping("/list")
	@ApiOperation("查询任务阶段列表")
	public Result<List<TaskStage>> list(TaskStage request) {
		LambdaQueryWrapper<TaskStage> wrapper = new LambdaQueryWrapper<>(request);
		wrapper.orderByDesc(TaskStage::getStatus);
		return Result.success(taskStageService.list(wrapper));
	}

	/**
	 * 分页查询任务阶段
	 * 按阶段状态倒序排列
	 *
	 * @param request 分页查询条件
	 * @return 分页阶段列表
	 */
	@PostMapping("/page")
	@ApiOperation("分页查询任务阶段")
	public Result<Page<TaskStage>> page(@RequestBody PageQuery<TaskStage> request) {
		LambdaQueryWrapper<TaskStage> wrapper = new LambdaQueryWrapper<>(request.getParam());
		wrapper.orderByDesc(TaskStage::getStatus);
		Page<TaskStage> pageResult = taskStageService.page(request.toPage(), wrapper);
		return Result.success(pageResult);
	}
}